Skip to Content

Nacos 是一个由阿里巴巴开源的、功能丰富的平台,主要用于动态服务发现、配置管理和服务管理。在现代微服务架构中,它扮演着至关重要的“注册中心”和“配置中心”的角色。

可以把它想象成微服务世界里的“电话簿 + 公告栏”:

  • 电话簿(服务发现):每个微服务启动时,都把自己的“姓名”(服务名)和“电话号码”(IP地址和端口)登记到 Nacos。其他服务想找它时,就去 Nacos 查一下电话号码,然后就能联系上了。
  • 公告栏(配置管理):管理员在 Nacos 上发布或更新“公告”(配置信息)。所有微服务都会盯着这个公告栏,一旦有新内容,就立刻拿来使用,而且整个过程不需要重启服务。

一、核心功能

Nacos 主要有两大核心功能:

  1. 服务注册与发现 (Service Discovery and Registration)

    • 服务注册:服务提供者(Provider)在启动时将自己的信息(服务名、IP、端口等)注册到 Nacos Server。
    • 服务发现:服务消费者(Consumer)向 Nacos Server 查询指定服务名的提供者列表,并获取其实例信息。
    • 心跳检测:Nacos Server 会定时向注册的服务实例发送心跳请求,如果某个实例长时间没有响应,就会被认为是“不健康”并从服务列表中剔除,从而保证了服务调用的高可用性。
  2. 动态配置管理 (Dynamic Configuration Management)

    • 集中管理:将所有服务的配置文件(如数据库连接、第三方服务密钥、业务开关等)集中存放在 Nacos Server,而不是散落在各个服务的代码包里。
    • 动态刷新:当配置发生变化时,Nacos Server 会主动通知监听了该配置的微服务。服务在收到通知后,可以动态地加载新配置,无需重启应用。这对于实现灰度发布、功能开关、动态降级等非常有用。
    • 多环境/多版本管理:通过 NamespaceGroup 的概念,可以轻松实现不同环境(开发、测试、生产)和不同分组的配置隔离。

二、如何开始使用 Nacos

1. 安装与启动 Nacos Server

对于初学者,最快的方式是使用单机模式。

前提条件:已安装 Java 8 或更高版本。

步骤

  1. 下载:从 Nacos 的 GitHub Releases 页面下载最新的稳定版压缩包(例如 nacos-server-x.x.x.zip)。

  2. 解压:将下载的压缩包解压到任意目录。

  3. 启动

    • Windows: 进入 nacos/bin 目录,双击 startup.cmd,或者在命令行中执行 startup.cmd -m standalone
    • Linux/macOS: 进入 nacos/bin 目录,执行命令 sh startup.sh -m standalone

    standalone 参数表示以单机模式启动。生产环境应使用集群模式。

  4. 访问控制台: 启动成功后,在浏览器中访问 http://127.0.0.1:8848/nacos。 默认的用户名和密码都是 nacos

登录后你就能看到 Nacos 的管理界面,可以在这里查看服务列表和管理配置文件。


三、在 Spring Cloud 中集成 Nacos

下面我们以最常见的 Java 微服务框架 Spring Cloud Alibaba 为例,演示如何使用 Nacos。

场景:一个服务提供者 (Provider) 和一个服务消费者 (Consumer)。

1. 使用 Nacos 作为注册中心

a. 添加依赖

pom.xml 中为 Provider 和 Consumer 都添加 Nacos Discovery 依赖:

<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>

(注意:请确保你的 Spring Cloud 和 Spring Cloud Alibaba 版本兼容)

b. 配置 application.yml

服务提供者 (provider-service):

server: port: 8081 spring: application: name: provider-service # 服务名 cloud: nacos: discovery: server-addr: 127.0.0.1:8848 # Nacos Server 地址

服务消费者 (consumer-service):

server: port: 8082 spring: application: name: consumer-service cloud: nacos: discovery: server-addr: 127.0.0.1:8848

c. 启用服务发现

在两个服务的 Spring Boot 启动类上都添加 @EnableDiscoveryClient 注解。

@SpringBootApplication @EnableDiscoveryClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }

d. 验证

  1. 启动 Nacos Server。
  2. 启动 provider-service
  3. 访问 Nacos 控制台 http://127.0.0.1:8848/nacos,在“服务管理” -> “服务列表”中,你应该能看到名为 provider-service 的服务,并且有一个健康实例。

e. 服务调用

在 Consumer 端,你可以使用 RestTemplateOpenFeign 来调用 Provider 的接口。通过 @LoadBalanced 注解,Spring Cloud 会自动从 Nacos 获取 provider-service 的地址并进行负载均衡。

// 在 Consumer 的配置类中 @Configuration public class RestTemplateConfig { @Bean @LoadBalanced // 开启负载均衡 public RestTemplate restTemplate() { return new RestTemplate(); } } // 在 Consumer 的 Controller 或 Service 中 @RestController public class ConsumerController { @Autowired private RestTemplate restTemplate; @GetMapping("/call-provider") public String callProvider() { // 直接使用服务名,而不是硬编码 IP 和端口 String result = restTemplate.getForObject("http://provider-service/some-endpoint", String.class); return "Result from provider: " + result; } }

2. 使用 Nacos 作为配置中心

a. 添加依赖

在需要使用 Nacos 配置的微服务中(比如 provider-service),添加 Nacos Config 依赖:

<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>

b. 创建 bootstrap.yml

重要:Nacos 配置的加载优先级高于 application.yml,所以必须在 bootstrap.yml 文件中配置 Nacos 地址。

provider-servicesrc/main/resources 目录下创建 bootstrap.yml

spring: application: name: provider-service cloud: nacos: config: server-addr: 127.0.0.1:8848 # Nacos Server 地址 file-extension: yml # 指定配置文件格式为 yml # group: DEV_GROUP # 可以指定分组,默认为 DEFAULT_GROUP # namespace: xxxxx-xxxx-xxxx # 可以指定命名空间ID

c. 在 Nacos 控制台创建配置

  1. 登录 Nacos 控制台。
  2. 进入“配置管理” -> “配置列表”。
  3. 点击右上角的“+”号创建新配置。
  4. 填写配置信息:
    • Data ID: provider-service.yml (默认规则是 ${spring.application.name}.${file-extension})
    • Group: DEFAULT_GROUP (除非你在 bootstrap.yml 中指定了其他组)
    • 配置格式: YAML
    • 配置内容:
      user: name: "Alice from Nacos" age: 25
  5. 点击“发布”。

d. 在代码中动态读取配置

provider-service 的代码中,使用 @Value 注解来注入配置。为了让配置能动态刷新,需要在对应的类上添加 @RefreshScope 注解。

import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RefreshScope // 允许配置动态刷新 public class ConfigController { @Value("${user.name}") private String userName; @Value("${user.age}") private Integer userAge; @GetMapping("/config") public String getConfig() { return "User Name: " + userName + ", Age: " + userAge; } }

e. 验证动态刷新

  1. 启动 provider-service
  2. 访问 http://localhost:8081/config,你会看到 User Name: Alice from Nacos, Age: 25
  3. 回到 Nacos 控制台,编辑 provider-service.yml 配置,将 user.name 改为 "Bob from Nacos",然后发布。
  4. 无需重启服务,再次访问 http://localhost:8081/config,你会发现返回内容已经变成了 User Name: Bob from Nacos, Age: 25

四、Nacos 的关键概念

  • Namespace (命名空间):用于进行租户级别的配置隔离。不同的命名空间下,可以有相同 GroupData ID 的配置。常用于区分不同的环境,如 devtestprod 环境。
  • Group (分组):将不同的配置集进行逻辑分组。例如,可以按业务模块或项目来划分,如 trade-groupuser-group
  • Data ID (数据ID):通常是配置文件的名称,是配置的唯一标识。

这三者共同确定一个唯一的配置。

总结

Nacos 通过将服务注册和配置管理两大功能合二为一,极大地简化了微服务架构的复杂性。它的优势在于:

  • 功能整合:一个组件解决两大核心问题,降低了技术栈的复杂度和维护成本。
  • 易于使用:提供了友好的控制台界面,上手简单。
  • 动态性强:无论是服务实例的上下线,还是配置的变更,都能被实时感知,无需重启应用。
  • 生态融合好:与 Spring Cloud 生态无缝集成,是 Spring Cloud Alibaba 技术栈的首选。
  • 支持多环境:通过 Namespace 机制,天然支持开发、测试、生产等多环境隔离。
Last updated on